Skip to content

Added i18n multilingual support#614

Open
Kunlun-Hub wants to merge 12 commits intonetbirdio:mainfrom
Kunlun-Hub:main
Open

Added i18n multilingual support#614
Kunlun-Hub wants to merge 12 commits intonetbirdio:mainfrom
Kunlun-Hub:main

Conversation

@Kunlun-Hub
Copy link
Copy Markdown

Description

I have added internationalization (i18n) multilingual support functionality based on the original codebase.

Changes

  • ✅ Integrated multilingual internationalization framework
  • ✅ Supported languages: [List the languages you support]
  • ✅ Language files location: [Specify the file location]
  • ✅ Users can switch languages through [Describe the switching method]
    Added i18n multilingual support, and has completed the translation of most Chinese languages.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 15, 2026

Important

Review skipped

Too many files!

This PR contains 295 files, which is 145 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8d1bbc84-1c1b-4259-ae6b-6874bedfe4d5

📥 Commits

Reviewing files that changed from the base of the PR and between b53802a and 6a6d7e0.

⛔ Files ignored due to path filters (5)
  • package-lock.json is excluded by !**/package-lock.json
  • src/app/apple-icon.png is excluded by !**/*.png
  • src/app/favicon.ico is excluded by !**/*.ico
  • src/assets/netbird-full.svg is excluded by !**/*.svg
  • src/assets/netbird.svg is excluded by !**/*.svg
📒 Files selected for processing (295)
  • .github/workflows/build_and_push.yml
  • .gitignore
  • README.md
  • docker/Dockerfile
  • package.json
  • src/app/(dashboard)/access-control/page.tsx
  • src/app/(dashboard)/control-center/page.tsx
  • src/app/(dashboard)/dns/nameservers/page.tsx
  • src/app/(dashboard)/dns/settings/page.tsx
  • src/app/(dashboard)/dns/zones/page.tsx
  • src/app/(dashboard)/events/audit/page.tsx
  • src/app/(dashboard)/events/proxy/page.tsx
  • src/app/(dashboard)/group/page.tsx
  • src/app/(dashboard)/groups/page.tsx
  • src/app/(dashboard)/network-routes/page.tsx
  • src/app/(dashboard)/network/page.tsx
  • src/app/(dashboard)/networks/page.tsx
  • src/app/(dashboard)/peer/page.tsx
  • src/app/(dashboard)/peers/page.tsx
  • src/app/(dashboard)/posture-checks/page.tsx
  • src/app/(dashboard)/reverse-proxy/custom-domains/page.tsx
  • src/app/(dashboard)/reverse-proxy/services/page.tsx
  • src/app/(dashboard)/settings/page.tsx
  • src/app/(dashboard)/setup-keys/page.tsx
  • src/app/(dashboard)/team/service-users/page.tsx
  • src/app/(dashboard)/team/user/page.tsx
  • src/app/(dashboard)/team/users/page.tsx
  • src/app/(remote-access)/peer/rdp/page.tsx
  • src/app/(remote-access)/peer/ssh/page.tsx
  • src/app/error/page.tsx
  • src/app/invite/page.tsx
  • src/assets/icons/IdentityProviderIcons.tsx
  • src/auth/OIDCError.tsx
  • src/auth/SessionLost.tsx
  • src/components/Badge.tsx
  • src/components/Card.tsx
  • src/components/DatePickerWithRange.tsx
  • src/components/DeviceCard.tsx
  • src/components/Dialog.tsx
  • src/components/DropdownInput.tsx
  • src/components/FancyToggleSwitch.tsx
  • src/components/Input.tsx
  • src/components/JSONFileUpload.tsx
  • src/components/NetworkRouteSelector.tsx
  • src/components/NoPeersGettingStarted.tsx
  • src/components/Notification.tsx
  • src/components/PeerGroupSelector.tsx
  • src/components/PeerSelector.tsx
  • src/components/PortSelector.tsx
  • src/components/SettingCard.tsx
  • src/components/UserSelector.tsx
  • src/components/VersionInfo.tsx
  • src/components/modal/Modal.tsx
  • src/components/select/SelectDropdown.tsx
  • src/components/select/SelectDropdownSearchInput.tsx
  • src/components/table/DataTable.tsx
  • src/components/table/DataTableFilter.tsx
  • src/components/table/DataTableGlobalSearch.tsx
  • src/components/table/DataTableMultiSelectPopup.tsx
  • src/components/table/DataTablePagination.tsx
  • src/components/table/DataTableRefreshButton.tsx
  • src/components/table/DataTableRowsPerPage.tsx
  • src/components/ui/AccessControlGroupCount.tsx
  • src/components/ui/AddGroupButton.tsx
  • src/components/ui/AddPeerButton.tsx
  • src/components/ui/AnnouncementBanner.tsx
  • src/components/ui/CitySelector.tsx
  • src/components/ui/CountrySelector.tsx
  • src/components/ui/DarkModeToggle.tsx
  • src/components/ui/HelpAndSupportButton.tsx
  • src/components/ui/InputDomain.tsx
  • src/components/ui/InstallNetBirdButton.tsx
  • src/components/ui/MultipleGroups.tsx
  • src/components/ui/NoResults.tsx
  • src/components/ui/NoResultsCard.tsx
  • src/components/ui/PageNotFound.tsx
  • src/components/ui/PeerCountBadge.tsx
  • src/components/ui/RestrictedAccess.tsx
  • src/components/ui/UserDropdown.tsx
  • src/contexts/AnalyticsProvider.tsx
  • src/contexts/DialogProvider.tsx
  • src/contexts/GroupProvider.tsx
  • src/contexts/ReverseProxiesProvider.tsx
  • src/hooks/useCopyToClipboard.ts
  • src/hooks/useUrlTab.ts
  • src/i18n/I18nProvider.tsx
  • src/i18n/messages.ts
  • src/interfaces/IdentityProvider.ts
  • src/layouts/AppLayout.tsx
  • src/layouts/Navigation.tsx
  • src/modules/access-control/AccessControlModal.tsx
  • src/modules/access-control/ssh/SSHAccessType.tsx
  • src/modules/access-control/ssh/SSHAuthorizedGroups.tsx
  • src/modules/access-control/ssh/SSHUsernameSelector.tsx
  • src/modules/access-control/table/AccessControlActionCell.tsx
  • src/modules/access-control/table/AccessControlActiveCell.tsx
  • src/modules/access-control/table/AccessControlPortsCell.tsx
  • src/modules/access-control/table/AccessControlPostureCheckCell.tsx
  • src/modules/access-control/table/AccessControlTable.tsx
  • src/modules/access-tokens/AccessTokenActionCell.tsx
  • src/modules/access-tokens/AccessTokensTable.tsx
  • src/modules/access-tokens/CreateAccessTokenModal.tsx
  • src/modules/activity/ActivityDescription.tsx
  • src/modules/activity/ActivityEventCodeSelector.tsx
  • src/modules/activity/ActivityTable.tsx
  • src/modules/activity/ActivityTypeIcon.tsx
  • src/modules/activity/UsersDropdownSelector.tsx
  • src/modules/common-table-rows/GroupsRow.tsx
  • src/modules/common-table-rows/LastTimeRow.tsx
  • src/modules/control-center/nodes/SelectGroupNode.tsx
  • src/modules/control-center/nodes/SelectUserNode.tsx
  • src/modules/dns/nameservers/NameserverModal.tsx
  • src/modules/dns/nameservers/NameserverTemplateModal.tsx
  • src/modules/dns/nameservers/table/NameserverActionCell.tsx
  • src/modules/dns/nameservers/table/NameserverGroupTable.tsx
  • src/modules/dns/zones/DNSRecordModal.tsx
  • src/modules/dns/zones/DNSZoneModal.tsx
  • src/modules/dns/zones/DNSZonesProvider.tsx
  • src/modules/dns/zones/records/DNSRecordActionCell.tsx
  • src/modules/dns/zones/records/DNSRecordTimeToLiveCell.tsx
  • src/modules/dns/zones/records/DNSRecordsTable.tsx
  • src/modules/dns/zones/table/DNSZonesActionCell.tsx
  • src/modules/dns/zones/table/DNSZonesGroupCell.tsx
  • src/modules/dns/zones/table/DNSZonesRecordsCell.tsx
  • src/modules/dns/zones/table/DNSZonesTable.tsx
  • src/modules/exit-node/AddExitNodeButton.tsx
  • src/modules/exit-node/ExitNodeDropdownButton.tsx
  • src/modules/exit-node/ExitNodeHelpTooltip.tsx
  • src/modules/groups/AssignPeerToGroupModal.tsx
  • src/modules/groups/AssignUserToGroupModal.tsx
  • src/modules/groups/EditGroupNameModal.tsx
  • src/modules/groups/GroupFilterSelector.tsx
  • src/modules/groups/SingleGroupSelector.tsx
  • src/modules/groups/details/GroupPeersSection.tsx
  • src/modules/groups/details/GroupResourcesSection.tsx
  • src/modules/groups/details/GroupUsersSection.tsx
  • src/modules/groups/table/GroupsActionCell.tsx
  • src/modules/groups/table/GroupsTable.tsx
  • src/modules/instance-setup/InstanceSetupWizard.tsx
  • src/modules/jobs/CreateDebugJobModal.tsx
  • src/modules/jobs/table/JobOutputCell.tsx
  • src/modules/jobs/table/JobParametersCell.tsx
  • src/modules/jobs/table/JobStatusCell.tsx
  • src/modules/jobs/table/JobTypeCell.tsx
  • src/modules/jobs/table/PeerRemoteJobsTable.tsx
  • src/modules/networks/NetworkModal.tsx
  • src/modules/networks/NetworkProvider.tsx
  • src/modules/networks/PolicyCell.tsx
  • src/modules/networks/misc/NetworkNavigation.tsx
  • src/modules/networks/resources/NetworkResourceAccessControl.tsx
  • src/modules/networks/resources/NetworkResourceModal.tsx
  • src/modules/networks/resources/ResourceActionCell.tsx
  • src/modules/networks/resources/ResourceEnabledCell.tsx
  • src/modules/networks/resources/ResourceGroupCell.tsx
  • src/modules/networks/resources/ResourceGroupModal.tsx
  • src/modules/networks/resources/ResourcePolicyCell.tsx
  • src/modules/networks/resources/ResourceSingleAddressInput.tsx
  • src/modules/networks/resources/ResourcesTabContent.tsx
  • src/modules/networks/resources/ResourcesTable.tsx
  • src/modules/networks/routing-peers/NetworkRoutingPeerModal.tsx
  • src/modules/networks/routing-peers/NetworkRoutingPeersTabContent.tsx
  • src/modules/networks/routing-peers/NetworkRoutingPeersTable.tsx
  • src/modules/networks/routing-peers/RoutingPeerMasqueradeSwitch.tsx
  • src/modules/networks/routing-peers/RoutingPeersActionCell.tsx
  • src/modules/networks/routing-peers/RoutingPeersEnabledCell.tsx
  • src/modules/networks/routing-peers/RoutingPeersMasqueradeCell.tsx
  • src/modules/networks/table/NetworkActionCell.tsx
  • src/modules/networks/table/NetworkPolicyCell.tsx
  • src/modules/networks/table/NetworkResourceCell.tsx
  • src/modules/networks/table/NetworkRoutingPeerCell.tsx
  • src/modules/networks/table/NetworksTable.tsx
  • src/modules/onboarding/Onboarding.tsx
  • src/modules/onboarding/OnboardingDevices.tsx
  • src/modules/onboarding/OnboardingEnd.tsx
  • src/modules/onboarding/OnboardingIntent.tsx
  • src/modules/onboarding/OnboardingSurvey.tsx
  • src/modules/onboarding/networks/OnboardingAddResource.tsx
  • src/modules/onboarding/networks/OnboardingAddRoutingPeer.tsx
  • src/modules/onboarding/networks/OnboardingAddUserDevice.tsx
  • src/modules/onboarding/networks/OnboardingTestResource.tsx
  • src/modules/onboarding/p2p/OnboardingFirstDevice.tsx
  • src/modules/onboarding/p2p/OnboardingSecondDevice.tsx
  • src/modules/peer/AccessiblePeersSection.tsx
  • src/modules/peer/AddRouteDropdownButton.tsx
  • src/modules/peer/EphemeralPeerIndicator.tsx
  • src/modules/peer/ExpirationDisabledIndicator.tsx
  • src/modules/peer/LoginRequiredIndicator.tsx
  • src/modules/peer/MinimalPeersTable.tsx
  • src/modules/peer/PeerExpirationSettings.tsx
  • src/modules/peer/PeerExpirationToggle.tsx
  • src/modules/peer/PeerNetworkRoutesSection.tsx
  • src/modules/peer/PeerRemoteJobsSection.tsx
  • src/modules/peer/PeerRouteActionCell.tsx
  • src/modules/peer/PeerRouteActiveCell.tsx
  • src/modules/peer/PeerRouteTypeCell.tsx
  • src/modules/peer/PeerRoutesTable.tsx
  • src/modules/peer/PeerSSHInstructions.tsx
  • src/modules/peer/PeerSSHPolicyInfo.tsx
  • src/modules/peer/PeerSSHPolicyModal.tsx
  • src/modules/peer/PeerSSHToggle.tsx
  • src/modules/peer/RemoteJobDropdownButton.tsx
  • src/modules/peers/PeerActionCell.tsx
  • src/modules/peers/PeerAddressCell.tsx
  • src/modules/peers/PeerAddressTooltipContent.tsx
  • src/modules/peers/PeerConnectButton.tsx
  • src/modules/peers/PeerGroupCell.tsx
  • src/modules/peers/PeerLastSeenCell.tsx
  • src/modules/peers/PeerMultiSelect.tsx
  • src/modules/peers/PeerNameCell.tsx
  • src/modules/peers/PeerOSCell.tsx
  • src/modules/peers/PeerStatusCell.tsx
  • src/modules/peers/PeerVersionCell.tsx
  • src/modules/peers/PeersTable.tsx
  • src/modules/posture-checks/checks/PostureCheckGeoLocation.tsx
  • src/modules/posture-checks/checks/PostureCheckNetBirdVersion.tsx
  • src/modules/posture-checks/checks/PostureCheckOperatingSystem.tsx
  • src/modules/posture-checks/checks/PostureCheckPeerNetworkRange.tsx
  • src/modules/posture-checks/checks/PostureCheckProcess.tsx
  • src/modules/posture-checks/checks/tooltips/GeoLocationTooltip.tsx
  • src/modules/posture-checks/checks/tooltips/NetBirdVersionTooltip.tsx
  • src/modules/posture-checks/checks/tooltips/OperatingSystemTooltip.tsx
  • src/modules/posture-checks/checks/tooltips/PeerNetworkRangeTooltip.tsx
  • src/modules/posture-checks/checks/tooltips/ProcessTooltip.tsx
  • src/modules/posture-checks/modal/PostureCheckModal.tsx
  • src/modules/posture-checks/table/PostureCheckBrowseTable.tsx
  • src/modules/posture-checks/table/PostureCheckMinimalTable.tsx
  • src/modules/posture-checks/table/PostureCheckTable.tsx
  • src/modules/posture-checks/table/cells/PostureCheckActionCell.tsx
  • src/modules/posture-checks/table/cells/PostureCheckPolicyUsageCell.tsx
  • src/modules/posture-checks/ui/PostureCheckCard.tsx
  • src/modules/posture-checks/ui/PostureCheckNoChecksInfo.tsx
  • src/modules/posture-checks/ui/PostureCheckOperatingSystemInfo.tsx
  • src/modules/posture-checks/ui/PostureCheckTabTrigger.tsx
  • src/modules/remote-access/rdp/RDPButton.tsx
  • src/modules/remote-access/rdp/RDPCertificateModal.tsx
  • src/modules/remote-access/rdp/RDPCredentialsModal.tsx
  • src/modules/remote-access/rdp/RDPTooltip.tsx
  • src/modules/remote-access/rdp/rdp-certificate-handler.ts
  • src/modules/remote-access/rdp/useRemoteDesktop.ts
  • src/modules/remote-access/ssh/SSHButton.tsx
  • src/modules/remote-access/ssh/SSHCredentialsModal.tsx
  • src/modules/remote-access/ssh/SSHTooltip.tsx
  • src/modules/remote-access/ssh/useSSH.ts
  • src/modules/remote-access/useNetBirdClient.ts
  • src/modules/reverse-proxy/ReverseProxyAccessControlRules.tsx
  • src/modules/reverse-proxy/ReverseProxyHTTPTargets.tsx
  • src/modules/reverse-proxy/ReverseProxyLayer4Content.tsx
  • src/modules/reverse-proxy/ReverseProxyModal.tsx
  • src/modules/reverse-proxy/ReverseProxyServiceModeSelector.tsx
  • src/modules/reverse-proxy/auth/AuthHeaderModal.tsx
  • src/modules/reverse-proxy/auth/AuthPasswordModal.tsx
  • src/modules/reverse-proxy/auth/AuthPinModal.tsx
  • src/modules/reverse-proxy/auth/AuthSSOModal.tsx
  • src/modules/reverse-proxy/domain/CustomDomainModal.tsx
  • src/modules/reverse-proxy/domain/CustomDomainSelector.tsx
  • src/modules/reverse-proxy/domain/CustomDomainVerificationModal.tsx
  • src/modules/reverse-proxy/domain/CustomDomainsTable.tsx
  • src/modules/reverse-proxy/domain/ReverseProxyDomainInput.tsx
  • src/modules/reverse-proxy/events/ReverseProxyEventsAuthMethodCell.tsx
  • src/modules/reverse-proxy/events/ReverseProxyEventsTable.tsx
  • src/modules/reverse-proxy/table/ReverseProxyActionCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyActiveCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyAuthCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyClusterCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyNameCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyStatusCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyTable.tsx
  • src/modules/reverse-proxy/table/ReverseProxyTargetsCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyTypeCell.tsx
  • src/modules/reverse-proxy/targets/ReverseProxyAddressInput.tsx
  • src/modules/reverse-proxy/targets/ReverseProxyTargetActionCell.tsx
  • src/modules/reverse-proxy/targets/ReverseProxyTargetCustomHeaders.tsx
  • src/modules/reverse-proxy/targets/ReverseProxyTargetModal.tsx
  • src/modules/reverse-proxy/targets/ReverseProxyTargetSelector.tsx
  • src/modules/reverse-proxy/targets/ReverseProxyTargetsTable.tsx
  • src/modules/reverse-proxy/targets/flat/ReverseProxyFlatTargetActionCell.tsx
  • src/modules/reverse-proxy/targets/flat/ReverseProxyFlatTargetsTabContent.tsx
  • src/modules/reverse-proxy/targets/flat/ReverseProxyFlatTargetsTable.tsx
  • src/modules/route-group/NetworkRoutesTable.tsx
  • src/modules/routes/RouteActionCell.tsx
  • src/modules/routes/RouteActiveCell.tsx
  • src/modules/routes/RouteAddRoutingPeerModal.tsx
  • src/modules/routes/RouteMetricCell.tsx
  • src/modules/routes/RouteModal.tsx
  • src/modules/routes/RouteTable.tsx
  • src/modules/routes/RouteUpdateModal.tsx
  • src/modules/settings/AuthenticationTab.tsx
  • src/modules/settings/ClientSettingsTab.tsx
  • src/modules/settings/DangerZoneTab.tsx
  • src/modules/settings/GroupsSettings.tsx
  • src/modules/settings/IdentityProviderModal.tsx
  • src/modules/settings/IdentityProvidersTab.tsx
  • src/modules/settings/NetworkSettingsTab.tsx
  • src/modules/settings/PermissionsTab.tsx
  • src/modules/setup-keys/SetupKeyModal.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@CLAassistant
Copy link
Copy Markdown

CLAassistant commented Apr 15, 2026

CLA assistant check
All committers have signed the CLA.

@Kunlun-Hub Kunlun-Hub mentioned this pull request Apr 15, 2026
Copy link
Copy Markdown
Author

@Kunlun-Hub Kunlun-Hub left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants